/*
 * ListaFrases.java
 * 
 * Created on 1/Dez/2007, 23:07:50
 * 
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Dicionario;

import Estado.StateArrow;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.NoSuchElementException;
import java.util.StringTokenizer;

/**
 *
 * @author Pedro
 */
public class ListaFrases implements IListaFrases {

    private ArrayList<Frase> lista = new ArrayList<Frase>();

    public ListaFrases(String frases) {


        StringTokenizer st = new StringTokenizer(frases, "\n");
        while (st.hasMoreTokens()) {
            Frase f = new Frase(st.nextToken());
            lista.add(f);
        }

        //  it.next();
    }

    public void addFrase(Frase f) {

        lista.add(f);
    }

    public ArrayList<Integer> getListaInicios(int i) {

        ArrayList<Integer> arr = new ArrayList<Integer>();
        Frase f;
        Iterator<Frase> it = lista.iterator();

        while (it.hasNext()) {
            f = it.next();
            if (f.getInicio() == i) {
                try {
                    arr.add(f.getId());
                } catch (NoSuchElementException e) {
                    System.out.println("Inicios:" + e + "Id: " + i + "\n");
                }
            }
        }
        return arr;
    }

    public ArrayList<Integer> getListaFins(int i) {

        ArrayList<Integer> arr = new ArrayList<Integer>();
        Frase f;
        Iterator<Frase> it = lista.iterator();

        while (it.hasNext()) {
            f = it.next();
            if (f.getFim() == i) {
                try {
                    arr.add(f.getId());
                } catch (NoSuchElementException e) {
                    System.out.println("Fins:" + e + "Id: " + i + "\n");
                }
            }
        }
        return arr;
    }
    
    
/*
  Dá a lista de estados para o qual este Estado i tem ligação
 Não é a lista de estado PARA i, mas sim a lista dos que PARTEM de i.
 *//*
    public ArrayList<Integer> getListaCaminhos(int i) {

        ArrayList<Integer> arr = new ArrayList<Integer>();
        ArrayList<Integer> arr2 = new ArrayList<Integer>();
       
        StateArrow sa = new StateArrow(i);
        
        for (int j = 0; j < lista.size(); j++) {

            if (lista.get(j).Contains(i)) {
                arr2.addAll(lista.get(j).getCaminhos(i));
                arr.addAll(arr2);
                // arr.addAll(lista.get(j).getCaminhos(i));
                //System.out.println("hola" + lista.get(j).getCaminhos(i));
            }
        }

/*        while (it.hasNext()) {
        if (it.next().Contains(i)) {
        try {
        System.out.println(it.next().getCaminhos(i));
        //arr.addAll(it.next().getCaminhos(i));
        arr.addAll(it.next().getCaminhos(i));
        } catch (NoSuchElementException e) {
        System.out.println("Caminhos:" + e + "Id: " + i + "\n");
        }
        }
        }*/
    /*
        return arr;
    }
*/
    
      public ArrayList<StateArrow> getListaCaminhos(int i) {

       
       ArrayList<StateArrow> listaCaminhos = new ArrayList<StateArrow>();
       ArrayList<StateArrow> listaCaminhosTemp = new ArrayList<StateArrow>(); 
       
      
        for (int j = 0; j < lista.size(); j++) {

   
            if (lista.get(j).Contains(i)) {
               
              // listaCaminhosTemp=getCaminhos(i, lista.get(j),listaCaminhos);
              // listaCaminhos.addAll(listaCaminhosTemp);
              getCaminhos(i, lista.get(j),listaCaminhos); 
              
            }
        }

/*        while (it.hasNext()) {
        if (it.next().Contains(i)) {
        try {
        System.out.println(it.next().getCaminhos(i));
        //arr.addAll(it.next().getCaminhos(i));
        arr.addAll(it.next().getCaminhos(i));
        } catch (NoSuchElementException e) {
        System.out.println("Caminhos:" + e + "Id: " + i + "\n");
        }
        }
        }*/
        return listaCaminhos;
    }
     public ArrayList<StateArrow> getCaminhos(int i, Frase f,ArrayList<StateArrow> listaCaminhos) {

       
         StateArrow st = new StateArrow();
        // ArrayList<StateArrow> listaCaminhos = new ArrayList<StateArrow>();
        int pal;

        for (int a = 0; a < f.palavras.size()-1; a++) {
            
        
            if (f.palavras.get(a).equals(i)) {
           
                st.setPalavra(f.palavras.get(a + 1));
                st.addFrase(f.getId());
             /*
                Se já existir na lista um caminho para o mesmo estado
                adiciona o id da frase a esse StateArrow em vez de criar outro.
              */
                if(listaCaminhos.size()==0)
                     listaCaminhos.add(st);
                else{
                for (int it = 0; it < listaCaminhos.size(); it++) {
                    if (listaCaminhos.get(it).getPalavra() == st.getPalavra()) {
                        if(!(listaCaminhos.get(it).getFrases().contains(f.getId())))
                        listaCaminhos.get(it).addFrase(f.getId());
                    } else {
                             listaCaminhos.add(st);
                         }
                     }
                 }
             }
         }
        return listaCaminhos;
    }
    
    
    public Frase getFrase(int i) {
        return lista.get(i);
    }

    public Frase getFraseById(int id)
    {
        Frase fr = new Frase("kkkkokoko");
        fr.removefirstpalavra();
        
          for(int i=0;i<lista.size();i++)
              if(lista.get(i).getId()== id)
              {   
                  fr.setId(lista.get(i).getId());
                 fr.palavrasString.addAll(lista.get(i).palavrasString);
                  return lista.get(i);
                  
              }
          return null;
    
    
    }
    
    public int getSize() {

        return lista.size();
    }
}
